package com.ruoyi.keypair.controller;

import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.keypair.service.IDidUserKeypairService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Map;

@RestController
@RequestMapping("/keypair")
public class DidUserKeypairController {

    @Autowired
    private IDidUserKeypairService keypairService;

    @Value("${app.debug.saveKey:false}")
    private boolean saveKeyDebug;

    @PostMapping("/generate/{userId}")
    public AjaxResult generateKeyPair(@PathVariable Long userId) {
        Map<String, String> keys = keypairService.generateKeyPair(userId);
// 调试模式：保存公私钥到文件（Java 8 兼容实现）
        if (saveKeyDebug) {
            // 1. 生成唯一文件名（用户ID + 时间戳，避免覆盖）
            String timestamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss"));
            String baseDir = "./keys_debug/"; // 文件保存目录（项目根目录下）

            try {
                // 2. 自动创建目录（不存在时创建，支持多级目录）
                Path dirPath = Paths.get(baseDir);
                if (!Files.exists(dirPath)) {
                    Files.createDirectories(dirPath);
                }

                // 3. 提取公私钥（确保Service返回的Map中key正确，如"privateKey"和"publicKey"）
                String privateKey = keys.get("privateKey");
                String publicKey = keys.get("publicKey");

                // 4. 保存私钥文件
                Path privateKeyPath = Paths.get(baseDir + "private_" + userId + "_" + timestamp + ".pem");
                Files.write(privateKeyPath, privateKey.getBytes(StandardCharsets.UTF_8)); // Java 8 核心API

                // 5. 保存公钥文件
                Path publicKeyPath = Paths.get(baseDir + "public_" + userId + "_" + timestamp + ".pem");
                Files.write(publicKeyPath, publicKey.getBytes(StandardCharsets.UTF_8));

                // 调试日志：打印保存路径
                System.out.println("[调试模式] 公私钥已保存到目录：" + baseDir);
                System.out.println("[调试模式] 私钥文件：" + privateKeyPath);
                System.out.println("[调试模式] 公钥文件：" + publicKeyPath);

            } catch (IOException e) {
                // 异常处理：打印错误信息（不影响主流程）
                System.err.println("[调试模式] 保存密钥文件失败！用户ID：" + userId);
                System.err.println("[调试模式] 错误原因：" + e.getMessage());
                e.printStackTrace();
            }
        }

        return AjaxResult.success(keys);
    }
}
